package com.defense.chat;
/**
* @类名  TestLog.java
* @作者  jinbanglong
* @版本  V1.0
* @日期  2019年6月28日-下午10:09:23
* @描述    聊天记录处理类（保存、查询）
*/

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import org.junit.Test;

public class ChatLog {
	private BufferedWriter bw;
	private BufferedReader br;
	FileWriter writer;
	public ChatLog() {
		
	}
	/**
	 * @param myName       自己的账户名（用户名不可重复）
	 * @param type         group（群聊） private（私聊） 
	 * @param uName		       对方账户（type=group是群 账户ID，type=private是聊天对方账户ID） 
	 * @param date		      日期    格式：yyyy-MM-dd        date==null时：写入    date<>null时获取       
	 * @return file       根据需求，返回文件对象
	 */
	public  File getFile(String myName,String type,String uName,String date) throws Exception {
		String fName="D://msg";
		File f = new File(fName);
		if(!f.exists()) {
			f.mkdir();
		}
		fName="D://msg/"+myName;
		f = new File(fName);
		if(!f.exists()) {
			f.mkdir();
		}
		fName=fName+"/"+type;
		f = new File(fName);
		if(!f.exists()) {
			f.mkdir();
		}
		fName=fName+"/"+uName;
		f = new File(fName);
		if(!f.exists()) {
			f.mkdir();
		}
		SimpleDateFormat sd = new SimpleDateFormat("yyyyMMdd");
		if(date==null) {
			fName=fName+"/"+sd.format(new Date())+".txt";
		}else {
			fName=fName+"/"+sd.format(new SimpleDateFormat("yyyy-MM-dd").parse(date))+".txt";
		}
//		System.out.println(fName);
		f = new File(fName);
		if(!f.exists()) {
			f.createNewFile();
		}
//		String path = String.format("D://%s/%s/%s/%s.txt",myName,type,uName,fName);
		return f;
	}
	
	/**
	 * @desc  向文件追加记录
	 * @param msg  内容（包含对方名称）
	 */
	public void appendLog(String myName,String type,String uName,String msg) throws Exception {
		createWriter( myName, type, uName);
//		bw.append(msg+'\n');
//		bw.flush();
		writer.write(msg+'\n');
		writer.flush();
	}
	
	/**
	 * @desc  创建缓冲流
	 * @param myName  当前账户
	 * @param type    group/private
	 * @param uName   对方账户
	 */
	private void createWriter(String myName,String type,String uName) throws Exception {
		File f = getFile(myName,type,uName,null);
//		OutputStreamWriter fos = new OutputStreamWriter(new FileOutputStream(f));
		
		writer = new FileWriter(f,true);
//		bw  = new BufferedWriter(fos);
	}
	/**
	 * @desc  根据日期读取聊天记录
	 * @param date         日期    格式：yyyy-MM-dd
	 * @param selfUname    自己的账户名（用户名不可重复）
	 * @param type         group（群聊） private（私聊） 
	 * @param uName		       对方账户（type=group是群 账户ID，type=private是聊天对方账户ID） 
	 * @throws IOException
	 */
	public void getLog(String myName,String type,String uName,String date) {
		 
		try {
			File f = getFile(myName,type,uName,date);
			InputStreamReader isr = new InputStreamReader(new FileInputStream(f));
			br  = new BufferedReader(isr);
			String str;
			while((str=br.readLine()) != null) {
				System.out.println(str);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//记录聊天记录
	public void saveLog(String myName,String way, String msg) {
		msg=msg.replaceAll(":", "：");//英文逗号，替换为中文
		String type="group";
		String uName="only";//群，目前只有一个，固定一个名字
		if("in".equals(way)) {
			if(msg.charAt(0)=='G') {
				type = "group";//群聊
				msg=msg.substring(2);
//				System.out.println("接收群："+msg);
			}else{
				type = "whisper";//私聊
				int firstIndex = msg.indexOf("【");
				int endIndex = msg.indexOf("】");
				uName = msg.substring(firstIndex+1, endIndex);
				msg=msg.substring(2);
				msg=msg.replace("对你", "");
				
			};
		}else if("out".equals(way)){
			
			if(msg.charAt(0)=='@') {
				type = "whisper";//私聊
				int firstIndex = msg.indexOf("@");
				int endIndex = msg.indexOf("：");
				uName = msg.substring(firstIndex+1, endIndex);
				msg=msg.replace("@"+uName, "【"+myName+"】说");//重新组合msg
			}else{
				type = "group";//群聊
				msg="【"+myName+"】说："+msg;//重新组合msg
			};
		}
		
		try {
//			System.out.println("存储的记录："+msg);
			appendLog(myName,type, uName, msg);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	
	@Test   //测试    内容追加
	public void log() throws Exception {
		String uName = "lin" ;
		String type = "group";
		String myName="self";
		String date = "2019-06-29";
		Scanner sc = new Scanner(System.in);
		while(true) {
			String msg = sc.nextLine();	
			appendLog(myName,type,uName,msg);
		}
	}
	@Test  //测试    内容读取
	public void TestgetLogs() {
		String uName = "lin" ;
		String type = "group";
		String myName="self";
		String date = "2019-06-29";
		getLog(myName,type,uName,date);
	}
	
}
